package com.yili.printer.generator;

import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * ZPL标签生成器
 * 负责生成ZPL打印指令，支持中文显示，字体较大，居中对齐
 * 标签尺寸：110mm × 50mm
 */
public class ZplLabelGenerator implements Generator {

    private static final Logger logger = LogManager.getLogger(ZplLabelGenerator.class);

    /**
     * 根据Map数据生成ZPL打印指令
     * 
     * @param printContent 打印内容Map
     * @return ZPL打印指令字符串
     */
    @Override
    public String generate(Map<String,String> printContent) {
        
        StringBuilder zpl = new StringBuilder();

        // 开始标签
        zpl.append("^XA");

        // 设置标签尺寸（110mm × 50mm，203 DPI）
        zpl.append("^PW880"); // 设置标签宽度为880点（110mm）
        zpl.append("^LL400"); // 设置标签长度为400点（50mm）

        // 设置字符编码为UTF-8以支持中文
        zpl.append("^CI28"); // UTF-8编码

        // 使用合适的字体大小，适应50mm高度的标签
        zpl.append("^CF0,50,40");

        // 计算居中位置和合理的布局
        int centerX = 50; // 左边距
        int startY = 50; // 起始Y位置
        int lineHeight = 100; // 行间距，适应50mm高度

        // 从Map中获取数据，支持灵活的标签内容
        String productionDate = printContent.get("productionDate");
        String productionBatch = printContent.get("productionBatch");
        String serial = printContent.get("serial");

        // 打印生产日期
        if (productionDate != null) {
            zpl.append("^FO").append(centerX).append(",").append(startY)
                    .append("^FD生产日期: ").append(productionDate).append("^FS");
        }

        // 打印生产批次
        if (productionBatch != null) {
            zpl.append("^FO").append(centerX).append(",").append(startY + lineHeight)
                    .append("^FD生产批次: ").append(productionBatch).append("^FS");
        }

        // 打印序号
        if (serial != null) {
            zpl.append("^FO").append(centerX).append(",").append(startY + lineHeight * 2)
                    .append("^FD序　　号: ").append(serial).append("^FS");
        }

        // 结束标签
        zpl.append("^XZ");

        logger.debug("生成的ZPL指令: " + zpl.toString());
        return zpl.toString();
    }
}